package org.ccay.manage.registry.service;

import java.util.List;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.ccay.core.exception.ApplicationException;
import org.ccay.core.registry.RegistryItem;
import org.ccay.manage.registry.vo.RegistryItemFullInfoVO;
import org.ccay.manage.registry.vo.RegistryTreeNodeVO;
import org.ccay.security.annotation.SecurityBindingURL;
import org.ccay.security.annotation.SecurityOperation;
import org.ccay.security.annotation.SecurityResource;

/**
 * 注册项扩展信息管理服务接口
 * 本接口提供运行时添加、删除及查找注册项的方法，以支持非停机更新注册项
 * @author chaowangbang
 * @since 2017年6月13日
 *
 */
@Path("/")
@Produces("application/json")
@SecurityResource(code = "registryManage", name = "系统管理|注册项管理")
public interface IRegistryExtInfoService {
	
	
	@SecurityOperation(code = "page", name = "页面权限")
	@SecurityBindingURL("/manage/registry/listRegistry.html")
	String REGISTRY_MANAGEMENT = "REGISTRY_MANAGEMENT";
	
	
	@SecurityOperation(code = "reload", name = "重新装载")
	String REGISTRY_MANAGEMENT_RELOAD = "REGISTRY_MANAGEMENT_RELOAD";

	
	/**
	 * 删除注册项
	 * @param registryItemName
	 * @throws ApplicationException 
	 */
	@DELETE
	@Path("/delete")
	@SecurityOperation(code = "delete", name = "删除注册项")
	public void deleteRegistry(@QueryParam("itemName") String registryItemName) throws ApplicationException;
	
	/**
	 * 插入注册项
	 * @param item
	 * @throws ApplicationException 
	 */
	@POST
	@Path("/createOrUpdate")
	@SecurityOperation(code = "createOrUpdate", name = "创建或修改注册项")
	public void createOrUpdateRegistryItem(RegistryItem item) throws ApplicationException;
	
	/**
	 * 查找注册项
	 * @param registryItemName
	 */
	@GET
	@Path("/find")
	@SecurityOperation(code = "page", name = "页面权限")
	public RegistryItemFullInfoVO findRegistry(@QueryParam("itemName") String itemName);
	
	
	/**
	 * 查找注册项
	 * 前端查询数据字典值服务
	 * 可以访问的数据字段 通过 id为registryPatternWhiteList的springBean指定，如果没有配置，则只能访问数据字典前端才可以访问
	 * @param registryItemName
	 */
	@GET
	@Path("/find/{itemName}")
	public RegistryItem findRegistryItem(@PathParam("itemName") String itemName);
	
	/**
	 * 查找注册项列表用复杂结构表示树结构
	 * @return
	 */
	@GET
	@Path("/list")
	public List<RegistryTreeNodeVO> listAll();
	
	
	/**
	 * 查找注册项列表用复杂结构表示树结构
	 * @return
	 */
	@GET
	@Path("/reload")
	public void reloadAll();
	

}
